package com.qf.mvc02.controller;


import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Controller
@RequestMapping("/upload")
public class UploadController {


    @Value("${mvc.fileDir}")
    private String fileDir;

    /**
     *
     * @param username 表单中的用户名
     * @param source 表单中上传 文件，需要 与表单中的name属性一致
     * @return
     */
    @RequestMapping("/test1")
    public String test1(String username, MultipartFile source) throws IOException {

        System.out.println(username);

        // 获取上传文件的原始文件名
        final String originalFilename = source.getOriginalFilename();

        // 文件名的生成
        String filePath = createFile(originalFilename);

        final File file = new File(filePath);

        source.transferTo(file);

        return "/hello.jsp";
    }

    private String createFile(String originalFilename) {

        // 生成一个随机的文件名
        final String filename = UUID.randomUUID().toString();

        // 文件扩展名的获取
        final String extension = FilenameUtils.getExtension(originalFilename);

        // 拼装最后的文件路径
        final String finalFilePath = fileDir + filename + "." +extension;

        return finalFilePath;
    }

    /**
     * 测试把上传的文件放到 web应用的 根目录下的uplaod目录中
     * @param username
     * @param source
     * @return
     */
    @RequestMapping("/test2")
    public String test2(String username, MultipartFile source, HttpServletRequest request) throws IOException {

        // 获取 ServletContext 对象的方式
        final ServletContext servletContext = request.getServletContext();

        // 获取 web根目录下的 指定目录的决绝路径
        final String realPath = servletContext.getRealPath("/upload");

        // 判断upload目录是否已经存在，如果不存在，则创建
        final File dir = new File(realPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        // 获取上传文件的原始文件名
        final String originalFilename = source.getOriginalFilename();

        // 生成一个随机的文件名
        final String filename = UUID.randomUUID().toString();

        // 文件扩展名的获取
        final String extension = FilenameUtils.getExtension(originalFilename);

        // 拼装最后的文件路径
        final String finalFilePath = realPath + File.separator + filename + "." +extension;


        final File file = new File(finalFilePath);



        source.transferTo(file);

        return "/hello.jsp";

    }


    /**
     * 演示ajax请求上传文件
     * @return
     */
    @RequestMapping("/test3")
    @ResponseBody
    public Map<String,String> test3(String username, MultipartFile source) throws IOException {

        System.out.println(username);

        // 获取上传文件的原始文件名
        final String originalFilename = source.getOriginalFilename();

        // 文件名的生成
        String filePath = createFile(originalFilename);

        final File file = new File(filePath);

        source.transferTo(file);

        final HashMap<String, String> map = new HashMap<>();

        map.put("status","ok");


        return map;

    }

}
